#include "en.hpp"

#include "starSystem.hpp"
#include "basePosition.hpp"
#include "baseOrbit.hpp"

std::vector< std::shared_ptr<starSystem> > en::systemList;
size_t en::curSystem;
sf::RenderWindow en::systemMap;
sf::View en::systemView;
std::weak_ptr<basePosition> en::cameraFocus;

void en::tick(int64_t timeStep)
{
	phys::globTime += timeStep;
	std::cout << "time = " << phys::globTime << "\n";
	// do universal stuff here
	size_t sysNum = systemList.size();
	for(size_t i = 0; i < sysNum; i++)
	{
		systemList[i]->tick(timeStep);
	}
}

void en::flushState()
{
	size_t sysNum = systemList.size();
	for(size_t i = 0; i < sysNum; i++)
	{
		systemList[i]->flushState();
	}

}

std::shared_ptr<starSystem> en::createStarSystem()
{
	// might want this to return a regular pointer to the starSystem
	std::shared_ptr<starSystem> sysPtr = std::make_shared<starSystem>();
	sysPtr->self = sysPtr;
	systemList.push_back( sysPtr );
	return(sysPtr);
}

std::shared_ptr<basePosition> en::createBasePosition()
{
	std::shared_ptr<basePosition> bodPtr = std::make_shared<basePosition>();
	bodPtr->self = bodPtr;
	return(bodPtr);
}

std::shared_ptr<baseOrbit> en::createBaseOrbit()
{
	std::shared_ptr<baseOrbit> bodPtr = std::make_shared<baseOrbit>();
	bodPtr->self = bodPtr;
	return(bodPtr);
}

void en::openMap()
{
	en::systemMap.create(sf::VideoMode(screen::X, screen::Y), "test");
	en::systemView.reset(sf::FloatRect(0, 0, screen::X, screen::Y));
	en::systemView.setCenter(0,0);
	en::systemView.zoom(screen::SCALE);
	en::snapCamera();

	en::systemMap.setView(systemView);
	en::systemMap.clear(screen::BLANKCOL);

	en::systemList[en::curSystem]->refreshDisp();
	en::systemList[en::curSystem]->draw(&en::systemMap);

	en::systemMap.display();
}

void en::snapCamera()
{
	if(!cameraFocus.expired())
	{
		stvec centre = cameraFocus.lock()->getStateAbs();
		en::systemView.setCenter(centre.px, centre.py);
	}
}

void en::refreshDisp()
{
	en::systemList[en::curSystem]->refreshDisp();
}
